package main

import (
	"fmt"
	"sync"
	"time"
)

var wg = sync.WaitGroup{}

//单项管道:可以在协程里只声明取值  不要求放值  或者相反
//双向管道可以转换单项管道  反之但不可以转换双向
//开协程取\放数据  尽量用单项channel
func consumer(queue <-chan int) {
	defer wg.Done()
	//for data := range queue {
	//	fmt.Println(data)
	//}
	for {
		data, ok := <-queue
		if !ok {
			break
		} else {
			fmt.Println(data, ok)
			time.Sleep(time.Second)
		}
	}
}
func stock(queue chan<- int) {
	defer wg.Done()
	for {
		queue <- 1
		time.Sleep(time.Second)
	}
}
func main() {
	//单向管道：
	/*
		var msg <-chan int   只能取不能放
		var msg chan <-int   只能放不能取
	*/
	var msg chan int
	//初始化的两种方式
	msg = make(chan int) //无缓冲
	//无缓冲  你在取值的时候如果没有会一直等到你放入值后运行 如果用完后防止再次运行  可以用close(msg)
	//有缓冲  你在取值时必须保持和缓冲数量一致  不然报错  如果用完后防止再次运行  可以用close(msg)
	wg.Add(1)
	go consumer(msg)
	//msg <- 2
	//因为协程已经消费了一个了  所以再放入是没有问题的
	//msg <- 2 这时 管道像有空间的数组
	//msg = make(chan int, 1) //1个缓冲空间
	msg <- 1
	//fmt.Println("等待返回值")
	fmt.Println(<-msg)
	close(msg)
	//已经关闭的 不能再发送数据  但是可以取数据 直到取完数据为止
	//关闭管道之前有正在取而正在写数据的管道时  会等待取完为止
	//如果放的大于取的空间   则报错
	wg.Wait()
}
